//package com.ruge.spring.cloud.gateway.base.exception;
//
///**
// * @author 嘿丷如歌
// * @version V1.0
// * @Description: springboot 异常
// * @date 2021/4/26 19:59
// */
//
//import com.ruge.spring.cloud.gateway.base.response.Response;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.autoconfigure.web.ServerProperties;
//import org.springframework.boot.web.servlet.error.ErrorController;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.MediaType;
//import org.springframework.http.ResponseEntity;
//import org.springframework.util.StringUtils;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//import org.springframework.web.servlet.HandlerMapping;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.HashSet;
//import java.util.Map;
//import java.util.Set;
//
///**
// * spring mvc 提供的全局异常拦截只支持controller中抛出异常的情况，但是如果进入不了controller，比如访问一个不存在的地址，springmvc不能处理。
// * 而spring提供了应对机制，同样基于springmvc来实现。
// * 当存在不存在地址时，spring会将请求发送到${server.error.path:${error.path:/error}}（默认为/error）这个contrller进行拦截，用户可以自定义异常信息。
// * Created by mallen on 10/18/17.
// */
//@RestController
//@RequestMapping("${server.error.path:${error.path:/error}}")
//public class SpringBootErrorController implements ErrorController {
//    @Autowired
//    private ServerProperties serverProperties;
//    @Autowired
//    private TimaExceptionProperties exceptionProperties;
//
//    @Override
//    public String getErrorPath() {
//        return this.serverProperties.getError().getPath();
//    }
//
//    @RequestMapping
//    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
//        HttpStatus status = getStatus(request);
//        Response errorBody = new Response();
//        errorBody.setStatus(Response.Status.FAILED);
//        errorBody.setErrorCode("SYS." + status.value());
//        errorBody.setErrorMessage(status.getReasonPhrase());
//
//        setResponseContentType(request);
//
//        return new ResponseEntity(errorBody, status);
//    }
//
//    /**
//     * 如果request没有设置accept参数，spring mvc会自动推测response的content type。
//     * 如果代码中引入了多种convertor，会导致convertor的自动推测达不到业务期望。所以，在此处设置默认的response的content type
//     *
//     * @param request
//     */
//    private void setResponseContentType(HttpServletRequest request) {
//        String accept = request.getHeader("accept");
//        if (StringUtils.isEmpty(accept) || accept.equals(MediaType.ALL_VALUE)) {
//            // 如果accept没有指定，则设置默认值
//            Set<MediaType> mediaTypes = new HashSet<>(1);
//            mediaTypes.add(MediaType.parseMediaType(exceptionProperties.getBoot().getDefaultContentType()));
//            // 设置到request的属性中，在spring mvc获取convertor时，会根据该值获取
//            request.setAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, mediaTypes);
//        }
//    }
//
//    protected HttpStatus getStatus(HttpServletRequest request) {
//        Integer statusCode = (Integer) request
//                .getAttribute("javax.servlet.error.status_code");
//        if (statusCode == null) {
//            return HttpStatus.INTERNAL_SERVER_ERROR;
//        }
//        try {
//            return HttpStatus.valueOf(statusCode);
//        } catch (Exception ex) {
//            return HttpStatus.INTERNAL_SERVER_ERROR;
//        }
//    }
//}
